home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Celestin Apprentice 5
/
Apprentice-Release5.iso
/
Source Code
/
C++
/
Applications
/
PICSee Dust 1.01
/
Quaternary Source
/
TimerUtils.cpp
< prev
next >
Wrap
Text File
|
1995-11-13
|
4KB
|
172 lines
/*
TimerUtils.cpp
Version History:
2.0 Nov 5 95 HTD
Updated file for PowerPC compatibility and add StartTimerFPS(),
a much easier method for starting the timer (pass the max speed
in terms of <frames per second> instead of passing a constant).
-------------------------------
Usage:
A typical way to use TimerUtils is as follows:
StartTimer(kTimerRate30fps); // Or use StartTimerFPS
do {
if (TimerDoNow()) {
// Do your thing...
AnimateNextFrame();
ResetTimer();
}
}
StopTimer();
*/
#include <Timer.h> // Required Time Manager interfaces
#include "TimerUtils.h"
// ---------------------------------------------------------------------------
typedef struct {
TMTask atmTask;
long tmWakeUp;
long tmReserved;
long tmRefCon;
} TimerInfo, *TimerInfoPtr, **TimerInfoHdl;
// --------------------------------------------------------------------------
static TimerInfo gTimerInfoTask;
static volatile short sIterationDelay = 0; // In milliseconds
static short sIterationDelaySave = 0;
volatile Boolean gTimeNow = true;
static TimerUPP sTimerProc = NULL;
// --------------------------------------------------------------------------
// --------------------------------------------------------------------------
#ifdef powerc
pascal void TimerTaskUpdater(TimerInfoPtr recPtr);
#else
pascal void TimerTaskUpdater();
#endif
void InstallTimerTask();
#ifdef powerc
// nothing
#else
pascal TimerInfoPtr GetTimerInfoTask() = { 0x2E89 };
#endif
// --------------------------------------------------------------------------
// TaskUpdater.
// Gets called once the delayed time is up. Just sets the global time
// variable, gTimeNow to true, resets the time delay for the next
// time task, and inserts itself into the time manager
// queue again so it gets called repeatedly.
#ifdef powerc
pascal void TimerTaskUpdater(TimerInfoPtr recPtr) {
#else
pascal void TimerTaskUpdater() {
long oldA5;
TimerInfoPtr recPtr;
recPtr = GetTimerInfoTask();
oldA5 = SetA5(recPtr->tmRefCon);
#endif
// Core stuff right here...
gTimeNow = true;
PrimeTime((QElemPtr)recPtr, sIterationDelay);
#ifdef powerc
// nothing
#else
oldA5 = SetA5(oldA5);
#endif
} // END TimerTaskUpdater
// --------------------------------------------------------------------------
// InstallTimerTask.
// Installs the time task into the time manager queue initially and sets
// the delay time between called tasks.
void InstallTimerTask() {
if (sIterationDelay == kTimerRateOff) {
gTimeNow = true; // will always remain true so routines will run as
return; // fast as the machine can run. Do not call Timer Manager.
}
if (sTimerProc == NULL) {
// Keep it static so if we're on PowerPC we only
// allocate the RoutineDescriptor *once*
sTimerProc = NewTimerProc(TimerTaskUpdater);
}
gTimerInfoTask.atmTask.tmAddr = sTimerProc;
gTimerInfoTask.tmWakeUp = 0;
gTimerInfoTask.tmReserved = 0;
gTimerInfoTask.tmRefCon = SetCurrentA5();
InsTime((QElemPtr)&gTimerInfoTask);
PrimeTime((QElemPtr)&gTimerInfoTask, sIterationDelay);
gTimeNow = false;
} // END InstallTimerTask
// ---------------------------------------------------------------------------
void SetTimerRate(short timerRate) {
sIterationDelay = timerRate;
gTimeNow = true;
} // END SetTimerRate
short GetTimerRate() {
return(sIterationDelay);
} // END GetTimerRate
void SaveTimerRate() {
sIterationDelaySave = sIterationDelay;
} // END SaveTimerRate
void RestoreTimerRate() {
sIterationDelay = sIterationDelaySave;
} // END RestoreTimerRate
// ---------------------------------------------------------------------------
void StartTimer() {
InstallTimerTask();
} // END StartTimer
void StartTimer(short timerRate) {
SetTimerRate(timerRate);
InstallTimerTask();
} // END StartTimer
void StartTimerFPS(short fps) {
SetTimerRate(1000/fps);
InstallTimerTask();
} // END StartTimerFPS
void ResetTimer() {
if (sIterationDelay != kTimerRateOff)
gTimeNow = false;
} // END ResetTimer
Boolean TimerDoNow() {
return(gTimeNow);
} // END TimerDoNow
void StopTimer() {
if (sIterationDelay == kTimerRateOff) return;
RmvTime((QElemPtr)&gTimerInfoTask);
gTimeNow = true; // Reset to true; this is default.
} // END StopTimer